package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

import java.time.LocalDateTime;

@RestController
@RequestMapping("/employee")
@Slf4j
@Api(tags = "员工管理接口")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    //post请求 查
    //HttpServletRequest参数是为了调session
    @PostMapping("/login")
    @ApiOperation(("登录系统"))
    public R<Employee> login(@RequestBody Employee employee,
                             HttpServletRequest request) {
        //接收+封装
        log.info("[登录]  用户名:{},密码:{}", employee.getUsername(), employee.getPassword());
        //调用 暂时不写  假设登录成功
        //1.根据用户名去查询用户
        //根据用户名查询用户getOne方法  参数是wrapper(条件)
        //创建条件查询对象
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        //条件查询判断输入参数姓名和表中姓名是否匹配
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        //调用employeeService(超级service里的方法)的方法getOne得到一个条件为queryWrapper的数据dbEmployee
        Employee dbEmployee = employeeService.getOne(queryWrapper);
        //判断姓名是否存在表中
        if (dbEmployee == null) {
            return R.error("登录失败,该员工不存在!!!!");
        }
        //2.对比密码
        //数据库表中查询到的数据dbEmployee调表中的密码
        String password = dbEmployee.getPassword();//md5加密的密码
        String formPassword = employee.getPassword();//获取输入的密码未加密->与数据比对
        //表中的密码都是加密的 所有的密码都是加密 我们需要转换成加密的格式在做对比
        //讲输入过来的密码转换成加密的密码 在与表中的密码做对比
        String md5Password = DigestUtils.md5DigestAsHex(formPassword.getBytes());
        //password是调到的原始加密密码 与用户输入转换之后的加密密码做对比
        if (!password.equals(md5Password)) {
            return R.error("登录失败,密码错误!!!");
        }
        //3.查看员工状态 Status就是员工表里面的员工状态
        //判断员工状态  员工状态分为 0和1  禁用 未禁用
        if (dbEmployee.getStatus() == 0) {
            return R.error("员工已禁用");
        }
        //4.把员工Id放入session从请求对象获取session set存入
        request.getSession().setAttribute("employee", dbEmployee.getId());
        //响应前端  数据封装dbEmployee 传过去
        return R.success(dbEmployee);
    }

    //退出系统
    @PostMapping("logout")
    @ApiOperation("退出系统")
    public R<String> logOut(HttpServletRequest request) {
        request.getSession().invalidate();
        return R.success("退出成功");

    }

    //添加员工 员工管理
    //返回字符串 请求post
    //方法名,返回值,方法参数(接收前端发来的JSON数据,加注解将JSOM转换)
    //这里我们还需要用到session所以参数还是需要加HttpServletRequest
    @PostMapping
    @ApiOperation(value = "新增员工")
    public R<String> saveEmployee(@RequestBody Employee employee, HttpServletRequest request) {
        //打印日志
        log.info("[线程的ID:{},新增员工:{}]",Thread.currentThread().getId(), employee);
        //1.设置新增员工初始密码
        //设置初始密码("123456"),数据库的木马是MD5加密
        //我们将密码转换成加密的密码 并且保存
        String dbPassword = DigestUtils.md5DigestAsHex("123456".getBytes());
        //保存密码
        employee.setPassword(dbPassword);
        //2.设置创建时间和更新时间
        //获取一个系统当前时间
        //LocalDateTime localDateTime = LocalDateTime.now();
        ////添加到创建时间中
        //employee.setCreateTime(localDateTime);
        //employee.setUpdateTime(localDateTime);
        ////在表中 有两个字段是更新归属(是谁更新的)所以我们要获取到当前账号ID存入字段
        ////获取当前用户登录的ID,这天记录是当前用户添加更新的
        //Long loginUserId = (Long) request.getSession().getAttribute("employee");//得到当前操作的用户
        ////存入表
        //employee.setCreateUser(loginUserId);
        //employee.setUpdateUser(loginUserId);
        //代码写到这里 所有需要写员工属性都写完了  我们调用service中的添加员工方法将其添加
        boolean save = employeeService.save(employee);
        //返回添加结果
        if (save) {
            return R.success("添加成功!!!");
        }
        return R.error("添加失败!!!");
    }


    //http://localhost:8080/employee/page?page=1&pageSize=1
    //写一个分页查询方法
    //前端传过来的请求是get请求
    //url:/employee/page?page=1&pageSize=10
    //路径page
    //我们使用page工具接收 所以参数里面不用加注解
    @GetMapping("/page")
    @ApiOperation(value = "员工分页列表查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "当前页码", required = true),
            @ApiImplicitParam(name = "pageSize", value = "每页条数", required = true),
            @ApiImplicitParam(name = "name", value = "员工名字", required = false)
    })
    public R<Page> findByPage(Integer page, Integer pageSize, String name) {
        //打印出得到的参数
        log.info("[查询结果page:{},pageSize:{},name:{}]", page, pageSize, name);
        //使用Mybatisplus里面的工具接收前端传来的参数
        // 需要把当前页面和每页条数赋值给Page对象
        Page pageInfo = new Page(page, pageSize);
        //代码写到这我们用苞米豆提供的条件查询工具来完成分页查询,如果使用MP做分页查询,前提条件是
        //设置分页插件
        //wrapper是条件
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper();
        //如果没有name,就没有条件
        wrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name);
        wrapper.orderByDesc(Employee::getUpdateTime);
        employeeService.page(pageInfo, wrapper);
        return R.success(pageInfo);
    }

    //http://localhost:8080/employee
    //写方法修改员工
    //返回值修改成功失败
    //在前端页面获取到是put请求
    //没有单独设置路径
    //参数员工类就可以 不是路径传参 加注解
    @PutMapping
    @ApiOperation("更新员工")
    public R<String> update(@RequestBody Employee employee,
                            HttpServletRequest request) {
        log.info("[更新员工:{}]", employee);
        // 调用service完成用户信息的更新,更新数据，我们看看还有哪些需要设置的？
        // 每个有公共字段，更新时间和更新用户必须设置
        //employee.setUpdateTime(LocalDateTime.now());//时间
        ////得到操做修改员工Id
        //Long loginUserId = (Long) request.getSession().getAttribute("employee");
        ////存入
        //employee.setUpdateUser(loginUserId);
        //存入
        employeeService.updateById(employee);
        return R.success("员工信息修改成功!!");
    }

    //http://localhost:8080/employee/1604850755917889538
    //编辑员工资料
    //通过前端界面得到
    //请求为get请求
    //通过url传参
    @GetMapping("/{id}")
    @ApiOperation("根据ID查找员工")
    public R<Employee> findById(@PathVariable Long id) {
        log.info("[根据ID查询:{}]", id);
        //service,根据ID获取对象
        Employee EmployeeById = employeeService.getById(id);
        //判断参数是不是空
        if (EmployeeById != null) {
            return R.success(EmployeeById);
        }
        return R.error("未查到该员工");
    }
}
